博客

Magento 二次开发系列八 — 重写商品模型Model

【php教程】Magento 二次开发系列八 — 重写商品模型Model

本节将介绍商品Model重写,这里的model是类模型,不是我们自定义的属性model,请区分。

1.core中商品model存储路径为 app/core/Mage/Catalog/Model/Product.php, 本着核心代码不修改的原则,拷贝它到app/local/Mage/Catalog/Model/目录下,这样我们就可以扩展它,但请记住,它原来的方法名称不能修改,但可以修改方法里面的逻辑。
2.我们要修改的方法是afterCommitCallback(),修改这个方法首先要明白这个方法是干什么的,通过方法名我们就能知道它的功能用途(番外话,一个好的命名多么重要),这个方法功能是商品在修改数据保存成功后回调的方法。因为我们要增加的逻辑是在商品保存后触发,所以选择这里,这样代码修改量最小;
3.修改的代码:

public function afterCommitCallback()
{
...原代码省略
//新增的逻辑
//involve save product model or part extend data
$extendsProduct = Mage::getModel('extends/product');
$extendsProduct->createExtend($this);

....
}

4.新增的方法,代码为:

function repalceName($keyword){
//replace keyword on product name
$productName = $this->getName();
//replace string in product name
$replace_keyword_in_name = $this->getData('replace_keyword_in_name');
$replaceName = $keyword;
$url_path = $this->getData('url_path');
$url_key = $this->getData('url_key');

if (!empty($replace_keyword_in_name) && !empty($replaceName)) {
$title = str_ireplace($replace_keyword_in_name, $replaceName, $title);
$productName = str_ireplace($replace_keyword_in_name, $replaceName, $productName);
$urlEncodeName = urlencode($replaceName);
$encodeReplaceKeyword = urlencode($replace_keyword_in_name);
$encodeReplaceKeyword = strtolower($encodeReplaceKeyword);
$url_path = str_ireplace($encodeReplaceKeyword, $urlEncodeName, $url_path);
$url_key = str_ireplace($encodeReplaceKeyword, $urlEncodeName, $url_key);

}

$this->setData('name',$productName);
$this->setData('product_name',$productName);
$this->setData('url_path',$url_path);
$this->setData('url_key',$url_key);
$this->getStockItem()->setData('product_name',$productName);
$this->getProductUrl();
$this->getRequestPath();

}


说下新增的方法用途:上面章节中提到了新增的属性,如果看了前面的章节应该知道我们已经在block文件中有替换操作了,为什么这里还需要呢?Block是显示用,但有些场景是没有显示的如何处理呢,所以我们就在Model层处理下,这样代码中如何有需要使用替换后的内容时,调用下这个方法就可以了。调用方法:$_product->repalceName($keyword), $keyword就是我们新增的属性model和part的单个值。

5.细心的网友会可能会发现,步骤3中新增的逻辑只有个调用方法,具体逻辑是什么呢?亲,稍等片刻,下节将为你介绍,因为它涵盖了创建独立模块的操作,所以我们单独展示。

注:此文为原创,如转载请注明出处。